package main

/*
采用json替换go语言中默认的Gob的序列化和反序列化
将rpc.ServeConn(conn)改为rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
rpc.ServeCodec()编解码函数，采用json解码
*/
import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)

// HelloService 定义一个简单结构体
type HelloService struct{}

// Hello 给结构体封装方法
func (s *HelloService) Hello(request string, reply *string) error {
	//修改入参指向的值
	*reply = "Hello " + request
	return nil
}

func main() {
	//1、实例化server ,采用net来实例化server,并指定地址端口及端口协议
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		panic("failed to listen: " + err.Error())
	}
	//将结构体HelloService{}对象注册到rpc中，名称(随便)：HelloService_1 ( 这里是2、注册处理逻辑handle )
	_ = rpc.RegisterName("HelloService_1", &HelloService{})
	//3、启动一个服务，刚才的listener接收请求，相当新的请求进来
	//for 循环防止处理一次请求之后就停止，go防止多个请求需要一个个等待
	for {
		conn, err := listener.Accept()
		fmt.Printf("%v", conn)
		if err != nil {
			panic("failed to accept connection" + err.Error())
		}
		//将默认的编码协议Gob改为通用的json， 将请求的socket给到rp后续处理，即将net和rpc关联起来
		go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
		//缺点：只能处理一次请求
	}

}
